package cn.edu.zut.pms.faker;

import com.github.javafaker.Faker;
import java.sql.*;
import java.util.Locale;
import java.util.Random;

public class FakerOrderFeedback {
    public static void main(String[] args) {
        // 数据库连接信息（请根据实际环境修改）
        String url = "jdbc:mysql://192.168.17.150:3306/soil?allowPublicKeyRetrieval=true&useSSL=false";
        String user = "root";
        String password = "000000";

        // 创建中文Faker实例
        Faker faker = new Faker(new Locale("zh_CN"));
        Random random = new Random();

        // 定义用户反馈类型（与源表dwd_logistics_data保持一致）
        String[] feedbacks = {"满意", "一般", "不满意", "未评价", "质量很好", "物流太慢", "包装破损"};
        // 反馈类型权重（模拟真实业务中用户反馈的自然分布）
        int[] feedbackWeights = {25, 15, 8, 20, 18, 8, 6}; // 总和为100

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            // 插入数据的SQL语句
            String insertSql = "INSERT INTO dwd_order_feedback (" +
                    "order_id, product_feedback" +
                    ") VALUES (?, ?)";

            try (PreparedStatement preparedStatement = connection.prepareStatement(insertSql)) {
                // 生成350条有效关联的订单反馈记录（可调整数量）
                for (int i = 0; i < 350; i++) {
                    // 生成与源表关联的有效订单号（格式与上游表保持一致）
                    String orderId = "ORD" + faker.number().numberBetween(10000000, 99999999);

                    // 按权重随机选择用户反馈（正面反馈占比更高，符合实际业务）
                    String productFeedback = getFeedbackByWeight(feedbacks, feedbackWeights, random);

                    // 设置参数（确保order_id非空，符合表设计要求）
                    preparedStatement.setString(1, orderId);
                    preparedStatement.setString(2, productFeedback);

                    preparedStatement.executeUpdate();
                }
                System.out.println("数据插入完成，共插入 350 条订单用户反馈记录");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 按权重随机选择反馈类型（权重越高，被选中概率越大）
    private static String getFeedbackByWeight(String[] feedbacks, int[] weights, Random random) {
        int total = 0;
        for (int weight : weights) {
            total += weight;
        }
        int rand = random.nextInt(total);
        int sum = 0;
        for (int i = 0; i < feedbacks.length; i++) {
            sum += weights[i];
            if (rand < sum) {
                return feedbacks[i];
            }
        }
        return feedbacks[0]; // 兜底返回第一个反馈类型
    }
}